import { message } from '@/components/XtxUI';
import type { Profile } from '@/types';
import { http } from '@/utils/request';
import { defineStore } from 'pinia';
import { computed, ref } from 'vue';
// import { useRouter } from 'vue-router';
// 非组件中，可通过导入路由实例，用于实现页面跳转
import router from '@/router';
import { useCartStore } from './cart';

export const useMemberStore = defineStore(
  'member',
  () => {
    // 用户信息
    const profile = ref<Profile>();

    // 把登录成功后续逻辑封装成通用函数
    const loginSuccess = (result: Profile) => {
      // 保存用户信息
      profile.value = result;
      // 用户提示
      message({ type: 'success', text: '登录成功' });
      // 跳转页面
      // ❌useRouter 使用有限制，只能使用于 setup 组合式API内
      // const router = useRouter();
      // console.log(22, router);   // undefined
      // router.push('/');
      // ✅非组件直接导入路由实例 import router from '@/router';
      // router.push('/');

      // 🔔router.currentRoute.value 功能等价于组合式API的 useRoute
      // 解构出回跳页面地址，如果没有就使用默认值 '/' 去首页
      const { target = '/' } = router.currentRoute.value.query;
      // 合并购物车
      const cart = useCartStore();
      cart.mergeCart();
      // 根据 target 跳转
      router.push(target as string);

      // 登录成功后，合并购物车
    };

    // 账号密码登录
    const loginAccount = async (data: object) => {
      const res = await http<Profile>('POST', '/login', data);
      // 调用登录成功后的函数，传递用户信息用于保存
      loginSuccess(res.data.result);
    };
    const mobileLogin = async (mobile: string, code: string) => {
      const res = await http<Profile>('POST', '/login/code', { mobile, code });
      loginSuccess(res.data.result);
    };
    // 计算登录状态，根据用户信息计算出用户是否已登录(会缓存)
    const isLogin = computed(() => {
      // Boolean 处理成布尔值
      return Boolean(profile.value);
    });
    // 获取验证码
    const sendMobileMsg = async (mobile: string) => {
      await http('get', '/login/code', { mobile });
    };
    // 绑定qq的短信验证码
    const sendQQBindMsg = async (mobile: string) => {
      await http('get', '/login/social/code', { mobile });
    };
    // 退出登录
    const logout = () => {
      // 1. 清理用户信息
      profile.value = undefined;
      // 清空购物车
      const cart = useCartStore();
      cart.clearCart();
      // 2. 提示用户
      message({ type: 'success', text: '退出成功' });
      // 3. 跳转页面
      router.push('/login');
    };

    // 第三方绑定登录
    const loginBind = async (data: object) => {
      // 发送登录请求
      const res = await http<Profile>('POST', '/login/social/bind', data);
      // 调用登录成功后的函数，传递用户信息用于保存
      loginSuccess(res.data.result);
    };

    // 发送绑定登录验证码
    const sendCodeBind = async (mobile: string) => {
      // 无需接收返回值，验证码是发送给用户手机的
      await http('GET', '/login/social/code', { mobile: mobile });
      // 成功提示即可
      message({ type: 'success', text: '发送验证码成功' });
    };

    // 三方登录-直接unionId登录
    const loginSocial = async (data: object) => {
      const res = await http<Profile>('POST', '/login/social', data);
      // console.log('POST', '/login/social', res);
      loginSuccess(res.data.result);
    };
    // 注册登录
    const registerLogin = async (data: object, unionId: string) => {
      const res = await http<Profile>(
        'POST',
        `/login/social/${unionId}/complement`,
        data
      );
      loginSuccess(res.data.result);
    };
    // 记得 return
    return {
      loginAccount,
      profile,
      isLogin,
      logout,
      loginBind,
      sendCodeBind,
      loginSocial,
      registerLogin,
      sendMobileMsg,
      mobileLogin,
      sendQQBindMsg,
    };
  },
  {
    // 开启持久化存储
    persist: {
      paths: ['profile'],
    },
  }
);
